爬虫实战|摩尔庄园微博话题讨论
本文作者:崔赵雯,中南财经政法大学金融学院
本文编辑:杨婉清
技术总编:王子一
Stata&Python云端课程来啦!
好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
引言
哈喽啊,铁铁们~虽说一年一度“假装儿童”的时刻已经过去了,但今年,真正的童年回忆重新上线啦,影响力一直持续到今日!今年的六一儿童节,《摩尔庄园》手游正式上线,激起了95后、00后的怀旧热潮,朋友圈、微博热搜、微博话题讨论都被摩尔庄园的热潮席卷。小编在微博冲浪时发现了一个有趣的微博话题——摩尔庄园段子大赏,今天就带大家一起瞅瞅网友的“最强大脑”。
1
准备工作
首先。我们打开微博网页版,搜索摩尔庄园。接着选择话题选项,找到摩尔庄园段子大赏话题。
进入话题后,打开开发者工具,通过观察Headers中的信息可以发现Request Headers中有一个信息为x-requested-with: XMLHttpRequest,这标记着此请求为Ajax请求。需要注意的是,新浪微博中的数据是采用Ajax加载进行显示的。Ajax加载即由JavaScript向服务器发送了一个请求来获取新的微博数据,并将其解析,最终将其渲染在网页中。那么我们只需要在Headers中加入此信息即可。
通过查看Preview参数,可以得到其响应的内容为json格式的数据。同时,可以观察到其最关键的信息是:cards,而其中在mblog的字段中,包含着我们所需的微博话题原文text_raw,在mblog字段中的user字段中,包含着我们所需的用户名称screen_name。
2
开始爬取
接下来,上程序:
import requests
from lxml import etree
import json
import pandas as pd
headers = {
"authority": "weibo.com",
"method": "GET",
"path": "/ajax/search/all?containerid=100103type%3D1%26q%3D%23%E6%91%A9%E5%B0%94%E5%BA%84%E5%9B%AD%E6%AE%B5%E5%AD%90%E5%A4%A7%E8%B5%8F%23%26t%3D3&page=1&count=20",
"cookie": "SINAGLOBAL=1123301353011.5188.1610958741628; login_sid_t=1ac4343a2ebca923def32a86b5b5c8c3; cross_origin_proto=SSL; wb_view_log=1440*9002; _s_tentry=www.baidu.com; UOR=,,www.baidu.com; Apache=3678708258471.648.1622617100926; ULV=1622617100934:2:1:1:3678708258471.648.1622617100926:1610958741637; SUB=_2A25Ns1x1DeRhGeNP6VMS8SfLyzSIHXVuycq9rDV8PUNbmtAKLWnskW9NTr5RxBpN_Mf4NoElnwUIh5zsP47AAjiX; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFQxYO65JmkKauvZCgPr6XL5JpX5KzhUgL.Fo-peo20eK.Nehn2dJLoI0YLxK.L1-zLB-qLxK-LB-BL1K5LxK.L1-zLB-qLxK-LB-BL1K5LxK.L1-zLB-qLxK-LB-BL1K5LxK-L1K2LBKqt; ALF=1654153125; SSOLoginState=1622617125; XSRF-TOKEN=FpAbhYmQvrVYRxTxgpR--YLT; WBPSESS=qVtvXfM6Pp6_zHT86UWMDeNmu5SpVmMf0jONV1m9CWhzTqZlXVPiIZLhTP9CRHSNaDJUoUkdkAyWPxhuETeOnCSFBofBx4lFYCm9i3QLCCfe1KE75qa60nPrZfkDGfLU",
"referer": "https://weibo.com/search?containerid=100103type%3D1%26q%3D%23%E6%91%A9%E5%B0%94%E5%BA%84%E5%9B%AD%E6%AE%B5%E5%AD%90%E5%A4%A7%E8%B5%8F%23%26t%3D3",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 ",
"x-requested-with": "XMLHttpRequest"
}
name_list=[]
txt_list=[]
for p in range (1,22):
print("正在抓取第%s页" % p)
url = "https://weibo.com/ajax/search/all?containerid=100103type%3D1%26q%3D%23%E6%91%A9%E5%B0%94%E5%BA%84%E5%9B%AD%E6%AE%B5%E5%AD%90%E5%A4%A7%E8%B5%8F%23%26t%3D3&page={}&count=20".format(p)
html = requests.get(url, headers = headers)
text = html.content.decode()
content_dict = json.loads(text)
cards = content_dict.get('data').get('cards') #列表
for c in cards:
type = c.get('card_type')
if type != 9:
print("跳过")
continue
else:
name = c.get('mblog').get('user').get('screen_name')
txt = c.get('mblog').get('text_raw')
name_list.append(name)
txt_list.append(txt)
print(name_list,txt_list)
得到的结果如下:
可以看到,爬取下来的微博话题讨论中包含着一些不必要的特殊符号,我们需要对这些特殊符号进行删除:
import re
txt_list = [re.sub(r'\u200b|\n','',t) for t in txt_list] #删除\u200b和\n
txt_list = [re.sub('\[.*?\]','',t) for t in txt_list] #删除[]及其里面内容
print(txt_list)
得到的结果如下:
接着我们将该结果输出到一个txt文件中:
file = r"/Users/cc/Desktop/cc的推文/摩尔庄园/微博话题.txt"
with open(file, "w", encoding="utf-8") as f :
for txt in txt_list:
f.write(txt + ',')
print("程序执行完毕")
这样我们就得到了一个只含有微博话题的文本文件。接下来,我们用词云图看一看哪些是段子中的高频词。
import matplotlib.pyplot as plt
import jieba
from wordcloud import wordcloud
import re
text = open('/Users/cc/Desktop/cc的推文/摩尔庄园/微博话题讨论test.txt', 'r', encoding='utf-8').read()
text = [re.sub('[^\u4e00-\u9fa5]','',te) for te in text]
text = ''.join(text)
text_cut = jieba.lcut(text)
text_cut = ' '.join(text_cut)
stop_words = open("/Users/cc/Desktop/cc的推文/摩尔庄园/停用词表.txt",encoding="utf8").read().split("\n")
wc = wordcloud.WordCloud(
font_path='/Users/cc/Desktop/cc的推文/摩尔庄园/simhei.ttf',
background_color='white',
width=1000,
height=600,
max_words=200,
max_font_size=100,
mask=plt.imread('/Users/cc/Desktop/cc的推文/摩尔庄园/图片.jpg'),
stopwords = stop_words
)
wc.generate(text_cut)
wc.to_file('/Users/cc/Desktop/cc的推文/摩尔庄园/词云.png')
plt.imshow(wc)
plt.axis('off')
plt.show()
3
输出结果
得到的结果如下:
从图中可以看出,“人类”、“峡谷”、“庄园”等是广大网友使用较为频繁的词汇。让我们看几条常出现词汇的讨论吧~
以上就是今天的全部内容了,如果喜欢这篇文章的话,别忘了点赞、转发、关注呦~
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐一季度财报出炉,哪些公司最赚钱?
技能篇 | 图片合并大法
批量空气质量数据文件合并分析
Stata17之日期时间新功能
Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》 数据可视化利器——Matplotlib从第七次人口普查看中国人口变化|Stata与Python交互绘图
200万投资者关注!!哪家公司这么牛?
带你领略一天天气之变化
利用pyecharts看微博粉丝地区分布
零值太多怎么办?解锁Stata17新命令ziologit
Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 初识PyStata
辞旧迎新——Stata17之Do-file编辑器优化
Stata17新亮点——解放表格输出生产力
【爬虫+可视化】链家网北京租房信息
手把手教你如何获取股票数据和可视化
Countvalues——数数的超级小帮手
下拉选择框如何变成“小猫咪” | selenium小技巧
Python中的运算符知多少?
快来get缺失值的正确打开方式
frame框架——我到底在哪个“房间”如何使用Pandas读取txt文件?
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。